package com.interview.b_并发.c_java_内存模型_JMM.c_可见性问题;

import java.util.HashSet;

/**
 * 不说可见性 单说并发问题
 * 出现三种情况
 * a=9;b=9 正确执行完毕
 * a=9;b=2 执行到 a=9 时 线程发生切换
 * a=1;b=2 没执行就输出了
 * <p>
 * <p>
 * 可见性问题
 * 线程A的操作 在线程A的本存中， 线程B的操作在B的本存中
 * 互相之间不可见 通过主存进行通信
 * 所以 A线程 写操作之后
 * 可能会存在 没来得及写入主缓存（线程间交流的方式）
 * 所以 B线程此时可能还看不到 就会输出 修改之前的值
 * <p>
 * a=1;b=9 主缓存中 a=1  ；  a=9 在本地缓存中，还没来得及写入主缓存
 * a=9;b=2 主缓存中 b=2  ；  b=9 在本地缓存中，还没来得及写入主缓存
 */
public class Test {
    private static HashSet<String> set = new HashSet<>();
    private int a = 1;
    private int b = 2;

    private void write() {
        a = 9;
        b = a;
    }

    private void read() {
//        System.out.println("a=" + a + ";b=" + b);
        set.add("a=" + a + ";b=" + b);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 200000; i++) {
            Test test = new Test();
            new Thread(() -> {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                test.write();
            }).start();

            new Thread(() -> {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                test.read();
            }).start();
        }
        for (String aaa : set) {
            System.out.println(aaa);
        }
    }

}
